package cn.bugstack.xfg.dev.tech.types;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
public abstract class BaseEvent<T> {

    public abstract EventMessage<T> buildEventMessage(T data);

    public abstract String topic();

    @Data
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public static class EventMessage<T> {
        private String id;
        private Date timestamp;
        private T data;
    }

}

/*
这个文件 BaseEvent.java 位于 xfg-dev-tech-types 模块下，主要作用如下：

1. 作用定位
- 这是一个事件基础抽象类，用于定义事件驱动架构中"事件"的通用结构和行为。
- 由于它在 types 模块，说明它是整个项目中事件相关类型的基础，供其他模块继承和复用。

2. 主要内容讲解
- BaseEvent<T> 是一个抽象类，泛型参数 T 代表事件中实际承载的数据类型。
- 核心抽象方法：
  - EventMessage<T> buildEventMessage(T data)：负责根据传入的数据构建一个事件消息对象，具体实现由子类完成。
  - String topic()：返回该事件对应的消息主题（如Kafka的topic），具体由子类实现。
- 内部静态类 EventMessage<T>：用于封装一次事件的消息内容，包含：
  - id：事件唯一标识
  - timestamp：事件发生时间
  - data：事件实际承载的数据（泛型）
- Lombok注解：@Data、@Builder、@AllArgsConstructor、@NoArgsConstructor 自动生成getter/setter、构造方法、builder等，简化代码。

3. 使用场景
- 其他模块（如领域、基础设施、触发层）在定义具体事件时，可以继承 BaseEvent<T>，实现自己的事件类型和消息构建逻辑。
- 通过统一的事件结构，方便事件的生产、消费、序列化和传输，特别适合Kafka等消息中间件场景。

4. 总结
- 该文件为项目中的事件体系提供了统一的基础抽象，保证了事件结构和处理方式的一致性。
- 便于后续扩展各种具体事件类型，并与消息中间件（如Kafka）集成。

如果你想看具体的事件实现或事件的使用方式，可以指定相关类名，我可以进一步讲解。
*/
